% Ejercicio "Declaraciones en JAVA"
\subsection*{\fbox{\theejercicio} - Declaraciones en JAVA}

Sea la gram\'atica que define la secci\'on de declaraci\'on de variables en JAVA (simplificada):

\begin{center}
\begin{tabular}{|lcl|} \hline
                             &               &                                           \\
{\em Lista-de-Declaraciones} & $\rightarrow$ & {\em Declaraci\'on}                       \\
                             & $|$           & {\em Lista-de-Delaraciones Declaraci\'on} \\
{\em Declaraci\'on}          & $\rightarrow$ & {\em Tipo Lista-de-Variables} {\bf ;}     \\
{\em Lista-de-Variables}     & $\rightarrow$ & {\bf IDENT}                               \\
                             & $|$           & {\bf IDENT,} {\em Lista-de-Variables}     \\
{\em Tipo}                   & $\rightarrow$ & {\bf IDENT}                               \\
                             & $|$           & {\bf INTEGER}                             \\
                             & $|$           & {\bf DOUBLE}                              \\
                             &               &                                           \\ \hline
\end{tabular}
\end{center}

Que permite declarar variables como por ejemplo:

\begin{verbatim}
int a,b,c;
double x,y;
Object r1, r2;
\end{verbatim}

Hallar una gram\'atica equivalente que cumpla la condici\'on LL(1) y construir para ella la tabla de an\'alisis LL(1).

% Solución del ejercicio
\subsubsection*{SOLUCI\'ON}

La soluci\'on es (en formato LEX; n\'otese que la P al final de algunos no terminales procede de la palabra ``prima''):

\begin{verbatim}
%token IDENT INTEGER DOUBLE

%%
ListaDeclaraciones  : Declaracion ListaDeclaracionesP
;
ListaDeclaracionesP : EPS
                    | Declaracion ListaDeclaracionesP
;
Declaracion         : Tipo ListaVariables
;
ListaVariables      : IDENT ListaVariablesP ';'
;
ListaVariablesP     : EPS
                    | ',' IDENT ListaVariablesP
;
Tipo                : IDENT
                    | INTEGER
                    | DOUBLE
;
\end{verbatim}

Esta gram\'atica ha sido obtenida por simple factorizaci\'on izquierda de la gram\'atica de partida puesto que, \'esta \'ultima, presenta problemas de recursi\'on a izquierda y de prefijos comunes.

Sabiendo que el conjunto CABECERA es (se omite el conjunto CABECERA del consecuente de cada regla puesto que se desprende claramente de su antecedente):

$CAB(ListaDeclaraciones) = \{IDENT,\ INTEGER,\ DOUBLE\}$        \\
$CAB(ListaDeclaracionesP) = \{EPS,\ IDENT,\ INTEGER,\ DOUBLE\}$ \\
$CAB(Declaracion) = \{IDENT,\ INTEGER,\ DOUBLE\}$               \\
$CAB(ListaVariables) = \{IDENT\}$                               \\
$CAB(ListaVariablesP) = \{EPS,\ ,\}$                            \\
$CAB(Tipo) = \{IDENT,\ INTEGER,\ DOUBLE\}$                      \\

El conjunto CABECERA del consecuente de cada regla es:

$CAB(ListaDeclaraciones\ :\ Declaracion\ ListaDeclaracionesP) = \{IDENT, INTEGER, DOUBLE\}$  \\
$CAB(ListaDeclaracionesP\ :\ EPS) = \{EPS\}$                                                 \\
$CAB(ListaDeclaracionesP\ :\ Declaracion\ ListaDeclaracionesP) = \{IDENT, INTEGER, DOUBLE\}$ \\
$CAB(Declaracion\ :\ Tipo\ ListaVariables) = \{IDENT,\ INTEGER,\ DOUBLE\}$                   \\
$CAB(ListaVariables\ :\ IDENT\ ListaVariablesP\ ;) = \{IDENT\}$                              \\
$CAB(ListaVariablesP\ :\ EPS) = \{EPS\}$                                                     \\
$CAB(ListaVariablesP\ :\ ,\ IDENT\ ListaVariablesP) = \{,\}$                                 \\
$CAB(Tipo\ :\ IDENT) = \{IDENT\}$                                                            \\
$CAB(Tipo\ :\ INTEGER) = \{INTEGER\}$                                                        \\
$CAB(Tipo\ :\ DOUBLE) = \{DOUBLE\}$                                                          \\

y el conjunto SIGUIENTE:

$SIG(ListaDeclaraciones) = \{\$\}$                        \\
$SIG(ListaDeclaracionesP) = \{\$\}$                       \\
$SIG(Declaracion) = \{IDENT,\ INTEGER,\ DOUBLE,\ \$\}$    \\
$SIG(ListaVariables) = \{IDENT,\ INTEGER,\ DOUBLE,\ \$\}$ \\
$SIG(ListaVariablesP) = \{;\}$                            \\
$SIG(Tipo) = \{IDENT\}$                                   \\

Se obtiene la siguiente tabla de an\'alisis (en formato habitual):

\begin{center}
\begin{tabular}{|l|lcl|} \hline
         &                           &               &                                               \\
{\tt 1}  & {\em ListaDeclaraciones}  & $\rightarrow$ & {\em Declaraci\'on} {\em ListaDeclaraciones'} \\
{\tt 2}  & {\em ListaDeclaraciones'} & $\rightarrow$ & $\varepsilon$                                 \\
{\tt 3}  &                           & $|$           & {\em Declaraci\'on} {\em ListaDeclaraciones'} \\
{\tt 4}  & {\em Declaraci\'on}       & $\rightarrow$ & {\em Tipo} {\em ListaVariables}               \\
{\tt 5}  & {\em ListaVariables}      & $\rightarrow$ & {\bf IDENT} {\em ListaVariables'} {\bf `;'}   \\
{\tt 6}  & {\em ListaVariablesP}     & $\rightarrow$ & $\varepsilon$                                 \\
{\tt 7}  &                           & $|$           & {\bf `,'} {\bf IDENT} {\em ListaVariables'}   \\
{\tt 8}  & {\em Tipo}                & $\rightarrow$ & {\bf IDENT}                                   \\
{\tt 9}  &                           & $|$           & {\bf INTEGER}                                 \\
{\tt 10} &                           & $|$           & {\bf DOUBLE}                                  \\
         &                           &               &                                               \\ \hline
\end{tabular}
\end{center}

\begin{center}
\begin{tabular}{|l|cccccc|} \hline
                          & {\bf IDENT} & {\bf INTEGER} & {\bf DOUBLE} & {\bf ;} & {\bf ,} & {\bf \$} \\ \hline
{\em ListaDeclaraciones}  & 1           & 1             & 1            &         &         &          \\
{\em ListaDeclaraciones'} & 3           & 3             & 3            &         &         & 2        \\
{\em Declaracion}         & 4           & 4             & 4            &         &         &          \\
{\em ListaVariables}      & 5           &               &              &         &         &          \\
{\em ListaVariables'}     &             &               &              & 6       & 7       &          \\
{\em Tipo}                & 8           & 9             & 10           &         &         &          \\ \hline
\end{tabular}
\end{center}